#Boa:Frame:Frame1

import wx
import utiles
import MySQLdb
import MySQLdb.cursors
import os

ARCHIVO = "fotossussan.txt"

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1PANEL1, 
 wxID_FRAME1RADIOBUTTON1, wxID_FRAME1RADIOBUTTON2, wxID_FRAME1STATICTEXT1, 
 wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3, wxID_FRAME1STATICTEXT4, 
 wxID_FRAME1STATICTEXT5, wxID_FRAME1TEXTCTRL1, wxID_FRAME1TEXTCTRL2, 
 wxID_FRAME1TEXTCTRL3, wxID_FRAME1TEXTCTRL4, wxID_FRAME1TEXTCTRL5, 
] = [wx.NewId() for _init_ctrls in range(16)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(398, 97), size=wx.Size(352, 308),
              style=wx.DEFAULT_FRAME_STYLE, title='Expotar-Importar')
        self.SetClientSize(wx.Size(344, 281))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(344, 281),
              style=wx.TAB_TRAVERSAL)

        self.radioButton1 = wx.RadioButton(id=wxID_FRAME1RADIOBUTTON1,
              label='Exportar', name='radioButton1', parent=self.panel1,
              pos=wx.Point(32, 24), size=wx.Size(81, 13), style=0)
        self.radioButton1.SetValue(True)

        self.radioButton2 = wx.RadioButton(id=wxID_FRAME1RADIOBUTTON2,
              label='Importar', name='radioButton2', parent=self.panel1,
              pos=wx.Point(32, 48), size=wx.Size(81, 13), style=0)
        self.radioButton2.SetValue(False)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
              label='Nombre de la Base de Datos', name='staticText1',
              parent=self.panel1, pos=wx.Point(32, 80), size=wx.Size(135, 13),
              style=0)

        self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name='textCtrl1',
              parent=self.panel1, pos=wx.Point(32, 96), size=wx.Size(120, 21),
              style=0, value='')

        self.staticText5 = wx.StaticText(id=wxID_FRAME1STATICTEXT5,
              label='Host', name='staticText5', parent=self.panel1,
              pos=wx.Point(32, 120), size=wx.Size(22, 13), style=0)

        self.textCtrl5 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL5, name='textCtrl5',
              parent=self.panel1, pos=wx.Point(32, 136), size=wx.Size(152, 21),
              style=0, value='')

        self.staticText4 = wx.StaticText(id=wxID_FRAME1STATICTEXT4,
              label='Nombre de la tabla', name='staticText4',
              parent=self.panel1, pos=wx.Point(32, 168), size=wx.Size(90, 13),
              style=0)

        self.textCtrl4 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL4, name='textCtrl4',
              parent=self.panel1, pos=wx.Point(32, 184), size=wx.Size(120, 21),
              style=0, value='')

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
              label='Nombre de usuario', name='staticText2', parent=self.panel1,
              pos=wx.Point(208, 80), size=wx.Size(90, 13), style=0)

        self.textCtrl2 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL2, name='textCtrl2',
              parent=self.panel1, pos=wx.Point(208, 96), size=wx.Size(100, 21),
              style=0, value='')

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3,
              label='Password', name='staticText3', parent=self.panel1,
              pos=wx.Point(208, 120), size=wx.Size(46, 13), style=0)

        self.textCtrl3 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL3, name='textCtrl3',
              parent=self.panel1, pos=wx.Point(208, 136), size=wx.Size(100, 21),
              style=wx.TE_PASSWORD, value='')

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Aceptar',
              name='button1', parent=self.panel1, pos=wx.Point(32, 232),
              size=wx.Size(80, 32), style=0)
        self.button1.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button1.Bind(wx.EVT_BUTTON, self.OnAceptar, id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(224, 232),
              size=wx.Size(83, 32), style=0)
        self.button2.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button2.Bind(wx.EVT_BUTTON, self.OnClickSalir,
              id=wxID_FRAME1BUTTON2)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.textCtrl1.SetValue("erpsussan")
        self.textCtrl4.SetValue("fotossussan")
        self.textCtrl5.SetValue("localhost")
        self.error = False
        self.procesados = 0

    def OnClickSalir(self, event):
        self.Close()

    def ordenCruda(self, consulta, par):
        try:
            db=MySQLdb.connect(host=par[4],user=par[1],passwd=par[2], \
                                db=par[0])
        except:
            if not self.error:
                texto = "Problemas de conexion con la base de datos"
                utiles.mensaje(None, texto)
                self.error = True
            return []
        if db == None: return []
        c=db.cursor()
        c.execute(consulta)
        utiles.logBD("ordenCruda: " + consulta)
        aux = c.fetchall()
        c.close()
        db.close()
        return aux

    def ordenCrudaDict(self, consulta, par, previo="SELECT 1"):
        try:
            db = MySQLdb.connect(host=par[4],user=par[1],passwd=par[2],db=par[0], \
                                    cursorclass=MySQLdb.cursors.DictCursor)
        except:
            if not self.error:
                texto = "Problemas de conexion con la base de datos"
                utiles.mensaje(None, texto)
                self.error = True
            return ([])
        if db == None: return ([])
        c=db.cursor()
        utiles.logBD("ordenCrudaDict: " + consulta)
        c.execute(previo)
        c.execute(consulta)
        aux = c.fetchall()
        c.close()
        db.close()
        return (aux)

    def leerTabla(self):
        parametros = (self.textCtrl1.GetValue(),self.textCtrl2.GetValue(), \
                    self.textCtrl3.GetValue(),self.textCtrl4.GetValue(), \
                    self.textCtrl5.GetValue())
        if "" in parametros:
            if not self.error:
                texto = " "*17 + "ERROR: faltan datos para\n"
                texto = texto + " "*21 + "realizar la conexion"
                utiles.mensaje(None, texto)
                self.error = True
            return ()
        sql = "SELECT ptc,codsussan,directorio,archivo FROM "
        sql = sql + ( " %s WHERE 1"  % (parametros[3]) )
        resultado = self.ordenCrudaDict(sql, parametros)
        if len(resultado) == 0:
            if not self.error:
                texto = " "*15 + "No hay informacion para trasladar"
                texto = texto + "\n" + " "*26 + "Tabla vacia!"
                utiles.mensaje(None, texto)
                self.error = True
            return 1
        return resultado
    
    def procesarTabla(self, resultado):
        print "Grabando:",ARCHIVO
        f = open(ARCHIVO,"w")
        for item in resultado:
            linea = item["codsussan"] + "," + item["ptc"] + ","
            linea = linea + item["directorio"] + "," + item["archivo"] + "\n"
            f.write(linea)
            self.procesados += 1
        f.close()

    def leerArchivo(self):
        parametros = (self.textCtrl1.GetValue(),self.textCtrl2.GetValue(), \
                    self.textCtrl3.GetValue(),self.textCtrl4.GetValue(), \
                    self.textCtrl5.GetValue())
        if "" in parametros:
            if not self.error:
                texto = " "*17 + "ERROR: faltan datos para\n"
                texto = texto + " "*21 + "realizar la conexion"
                utiles.mensaje(None, texto)
                self.error = True
            return 1
        print "Leyendo:",ARCHIVO
        try:
            f = open(ARCHIVO,"r")
        except:
            texto = " "*22 + "ERROR al abrir el archivo"
            utiles.mensaje(None, texto)
            self.error = True
            return 1
        resultado = []
        try:
            for item in f.readlines():
                cod,ptc,dir,arc = item[:-1].split(",")
                resultado.append({'codsussan':cod,'ptc':ptc,'directorio':dir,'archivo':arc})
                self.procesados += 1
        except:
            texto = " "*23 + "ERROR al leer el archivo"
            utiles.mensaje(None, texto)
            self.error = True
            return 1
        f.close()
        print "Se leyeron %s registros" % (self.procesados)
        self.procesados = 0
        return resultado

    def isExistRegistro(self,cod,ptc,par):
        sql = "SELECT codsussan,ptc FROM fotossussan WHERE "
        sql = sql + "codsussan='%s' AND ptc='%s'" % (cod,ptc)
        aux = self.ordenCruda(sql, par)
        if aux == (): return False
        return True

    def insertarBarras(self, sql):
        aux1 = sql.split("\\")
        aux2 = []
        for elemento in aux1[1:-1]:
            aux2.append("\\\\")
            aux2.append(elemento)
        aux2.append("\\\\")
        aux3 = ""
        for aux1 in aux2:
            aux3 = aux3 + aux1
        return aux3

    def insertRegistro(self,item,parametro):
        cod = item["codsussan"]
        ptc = item["ptc"]
        dir = self.insertarBarras(item["directorio"])
        arc = item["archivo"]
        aux1 = "INSERT INTO fotossussan(ptc, codsussan, directorio, archivo) "
        aux2 = "VALUES ('%s','%s','%s','%s')" % (ptc, cod, dir, arc)
        sql = aux1 + aux2
        resultado = self.ordenCruda(sql, parametro)
        if len(resultado) != 0:
            print "ERROR",sql
            self.error = True
            return 1
        self.procesados += 1
        return 0

    def modificarRegistro(self,item,parametro):
        cod = item["codsussan"]
        ptc = item["ptc"]
        dir = self.insertarBarras(item["directorio"])
        arc = item["archivo"]
        aux1 = "UPDATE fotossussan SET "
        aux2 = "directorio = '%s', archivo = '%s' " % (dir, arc)
        aux3 = "WHERE ptc = '%s' AND codsussan = '%s'" % (ptc, cod)
        sql = aux1 + aux2 + aux3
        resultado = self.ordenCruda(sql, parametro)
        if len(resultado) != 0:
            print "ERROR",sql
            self.error = True
            return 1
        self.procesados += 1
        return 0

    def procesarArchivo(self, resultado):
        par = (self.textCtrl1.GetValue(),self.textCtrl2.GetValue(), \
                self.textCtrl3.GetValue(),self.textCtrl4.GetValue(), \
                self.textCtrl5.GetValue())
        for item in resultado:
            if self.isExistRegistro(item["codsussan"],item["ptc"],par):
                self.modificarRegistro(item,par)
            else:
                self.insertRegistro(item,par)
        if self.error:
            texto = " "*17 + "ERROR al insertar registros"
            utiles.mensaje(None, texto)
            self.error = False
            return 1
        return 0

    def OnAceptar(self, event):
        print "Procesando..."
        if self.radioButton1.GetValue():
            print "EXPORTAR"
            resultado = self.leerTabla()
            if self.error:
                self.error = False
                return 1
            self.procesarTabla(resultado)
        else:
            print "IMPORTAR"
            if not os.path.lexists(ARCHIVO):
                texto = " "*12 + "No existe el archivo para transferir"
                utiles.mensaje(None, texto)
                return 1
            resultado = self.leerArchivo()
            if self.error:
                self.error = False
                return 1
            self.procesarArchivo(resultado)

        print "Se procesaron %s registros" % (self.procesados)
        print "Fin del procesamiento"
        self.procesados = 0
